package controleur;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import modele.*;
import modele.exceptions.*;
import controleur.exceptions.*;

/**
 * Servlet unique / Controleur
 */
public class Controleur extends HttpServlet {

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setContentType("text/html;charset=UTF-8");
        request.setCharacterEncoding("UTF-8");

        //Aiguilleur

        String action = request.getParameter("action");
        String forward = null;
        try {

            if (action == null) {
                if (request.getSession().getAttribute("identifie") == null) //Si on vient d'arriver et qu'on n'est pas connecté, afficher l'authentification
                {
                    forward = "authentification";
                } else //Si on est déjà connecté, afficher la page principale
                {
                    forward = livret(request);
                }
            } else if (action.equals("authentification")) //Si on a saisi un login mdp pour s'authentifier
            {
                forward = authentification(request);
            } else if (request.getSession().getAttribute("identifie") == null) //Si on n'est pas connecté
            {
                forward = "authentification";
            } else if (action.equals("deconnexion")) //Si on a cliqué sur 'Déconnexion'
            {
                forward = deconnexion(request);
            } else if (action.equals("profil")) //Si on veut consulter un profil
            {
                forward = profil("action", "erreur", request);
            } else if (action.equals("retourTuteur")) //Editer/Consulter un retour d'un tuteur sur un étudiant
            {
                forward = retourTuteur("action", "erreur", request);
            } else if (action.equals("retourMaitre")) //Editer/Consulter un retour de maitre sur un étudiant
            {
                forward = retourMaitre("action", "erreur", request);
            } else if (action.equals("retourAdmin")) //Editer/Consulter un retour d'admin sur un étudiant
            {
                forward = retourAdmin("action", "erreur", request);
            } else if (action.equals("retourMatiere")) //Editer/Consulter un retour d'un étudiant sur une matière
            {
                forward = retourMatiere("action", "erreur", request);
            } else if (action.equals("retoursMatiere")) //Liste des retours sur matière d'un enseignant
            {
                forward = retoursMatiere(request);
            } else if (action.equals("profilIntervenant")) //Consulter un profil d'intervenant
            {
                forward = profilIntervenant(request);
            } else if (action.equals("consulter")) //Liste des étudiants pour un tuteur ou un maitre
            {
                forward = consulter(request);
            } else if (action.equals("consulterLivret")) //Consultation d'un livret d'étudiant pour un tuteur, maitre, ou admin
            {
                forward = consulterLivret(request);
            } else if (action.equals("consulterAdmin")) //Liste d'étudiants, tuteurs, et maitres pour un admin
            {
                forward = consulterAdmin(request);
            } else if (action.equals("gestionMaitre")) //Gestion des maitres de l'admin
            {
                forward = gestionMaitre(request);
            } else if (action.equals("ajoutModifMaitre")) //Préparer le formulaire d'ajout ou de modification d'un maitre
            {
                forward = ajoutModifMaitre(request);
            } else if (action.equals("ajouterMaitre")) //Validation d'ajout d'un maitre de stage
            {
                forward = ajouterMaitre(request);
            } else if (action.equals("modifierMaitre")) //Validation de modification d'un maitre de stage
            {
                forward = modifierMaitre(request);
            } else if (action.equals("supprimerMaitre")) //Suppression un maitre de stage
            {
                forward = supprimerMaitre(request);
            } else //Si l'action est inconnue
            {
                forward = erreur("action", "erreur", request);
            }
        } catch (Exception e) {
            forward = erreur("action", "erreur", request);
            request.setAttribute("erreur", "Erreur.");
        }

        request.getRequestDispatcher("jsp/" + forward + ".jsp").forward(request, response);
    }

    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
    /** 
     * Handles the HTTP <code>GET</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        processRequest(request, response);

    }

    /** 
     * Handles the HTTP <code>POST</code> method.
     * @param request servlet request
     * @param response servlet response
     * @throws ServletException if a servlet-specific error occurs
     * @throws IOException if an I/O error occurs
     */
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);

    }

    /** 
     * Returns a short description of the servlet.
     * @return a String containing servlet description
     */
    @Override
    public String getServletInfo() {
        return "Short description";
    }// </editor-fold>

    private String authentification(HttpServletRequest request) {

        String login = request.getParameter("login");
        String password = request.getParameter("mdp");
        Personne identifie = null;
        String forward = "authentification";

        try {
            Utilisateur user = Utilisateur.getUtilisateur(login, password);
            identifie = user.getPersonne();

            //Préparer les variables de session lorsque l'authentification a réussi
            HttpSession session = request.getSession();
            session.setAttribute("identifie", identifie);
            session.setAttribute("typePersonne", identifie.getClass().getSimpleName());

            forward = livret(request);

        } catch (UtilisateurInexistantException e) {
            //Authentification incorrecte
            request.setAttribute("erreur", "Login ou mot de passe incorrect.");

        } catch (PersonneInexistanteException e) {
            request.setAttribute("erreur", "La BD est incohérente. (ex : L'étudiant a un tuteur qui n'existe pas.)");

        } catch (FormationInexistanteException e) {
            request.setAttribute("erreur", "La BD est incohérente. (L'étudiant a une formation qui n'existe pas.)");

        } catch (SQLException e) {
            request.setAttribute("erreur", "Erreur de la base de données.");
        }

        return forward;
    }

    private String deconnexion(HttpServletRequest request) {
        request.getSession().invalidate();
        return "authentification";
    }

    private String livret(HttpServletRequest request) {
        String forward = "livret";

        String typePersonne = (String) request.getSession().getAttribute("typePersonne");

        //Construction du menu
        request.setAttribute("lesPages", Fonctions.pagesAutorisees(typePersonne));

        //Page d'accueil (par défaut)
        if (request.getAttribute("action") == null) {
            if (!typePersonne.equals("MembreAdministration")) {

                forward = profil("action", "erreur", request);
            } else {
                forward = consulterAdmin(request);
            }
        }

        return forward;
    }

    /**
     * Afficher le profil de la personne connectée ou de l'étudiant consulté
     * @param action "action" si on affiche le profil de la personne connectée, "page" sinon
     * @param erreur "erreur" si on affiche le profil de la personne connectée, "sousErreur" sinon
     */
    private String profil(String action, String erreur, HttpServletRequest request) {
        request.setAttribute(action, "profil");

        //Préparer le menu
        String forward = livret(request);

        String afficher = request.getParameter("afficher");
        Personne identifie = (Personne) request.getSession().getAttribute("identifie");

        Personne profilConsulte = null;

        try {

            if (action.equals("action")) //On consulte son propre profil
            {
                profilConsulte = identifie;
            } else //Un non-étudiant consulte un profil d'étudiant
            {
                profilConsulte = (Etudiant) request.getAttribute("etudiantConsulte");
            }

            if (afficher != null) //Afficher le tuteur ou le maitre de stage d'un étudiant
            {
                if (afficher.equals("Intervenant")) {
                    profilConsulte = ((Etudiant) profilConsulte).getTuteur();
                } else if (afficher.equals("MaitreDeStage")) {
                    profilConsulte = ((Etudiant) profilConsulte).getMaitreDeStage();
                } else {
                    profilConsulte = identifie;
                }
            }
            
            request.setAttribute("profilConsulte", profilConsulte);

        } catch (PasDeTuteurException e) {
            request.setAttribute(erreur, e.toString());
        } catch (PasDeMaitreDeStageException e) {
            request.setAttribute(erreur, e.toString());
        }

        return forward;
    }

    /**
     * Afficher ou éditer un retour du tuteur, si on est étudiant, ou qu'on le consulte
     * @param action "action" si on est l'étudiant, "page" si on est non-étudiant
     * @param erreur "erreur" si on est l'étudiant, "sousErreur" si on est non-étudiant
     */
    private String retourTuteur(String action, String erreur, HttpServletRequest request) {

        request.setAttribute(action, "retourTuteur");
        String forward = livret(request);

        try {
            request.getSession().setAttribute("retour", Fonctions.getRetourTuteur(request));

            request.setAttribute("typePersonneConsulte", "Intervenant");

        } catch (PasDeTuteurException e) {
            request.setAttribute(erreur, e.toString());
        } catch (SQLException e) {
            request.setAttribute(erreur, "Erreur de la base de données.");
        }

        return forward;
    }

    /**
     * Afficher ou éditer un retour du maitre, si on est étudiant, ou qu'on le consulte
     * @param action "action" si on est l'étudiant, "page" si on est non-étudiant
     * @param erreur "erreur" si on est l'étudiant, "sousErreur" si on est non-étudiant
     */
    private String retourMaitre(String action, String erreur, HttpServletRequest request) {

        request.setAttribute(action, "retourMaitre");
        String forward = livret(request);

        try {
            request.getSession().setAttribute("retour", Fonctions.getRetourMaitre(request));

            request.setAttribute("typePersonneConsulte", "MaitreDeStage");

        } catch (PasDeMaitreDeStageException e) {
            request.setAttribute(erreur, e.toString());
        } catch (SQLException e) {
            request.setAttribute(erreur, "Erreur de la base de données.");
        }

        return forward;
    }

    /**
     * Afficher ou éditer un retour de l'admin, si on est étudiant, ou qu'on le consulte
     * @param action "action" si on est l'étudiant, "page" si on est non-étudiant
     * @param erreur "erreur" si on est l'étudiant, "sousErreur" si on est non-étudiant
     */
    private String retourAdmin(String action, String erreur, HttpServletRequest request) {

        request.setAttribute(action, "retourAdmin");
        String forward = livret(request);

        try {
            request.getSession().setAttribute("retour", Fonctions.getRetourAdmin(request));

            request.setAttribute("typePersonneConsulte", "MembreAdministration");

        } catch (SQLException e) {
            request.setAttribute(erreur, "Erreur de la base de données.");
        }

        return forward;
    }

    /**
     * Afficher ou éditer un retour sur matière, si on est étudiant, ou qu'on le consulte
     * @param action "action" si on est l'auteur de la matière, "page" si on consulte
     * @param erreur "erreur" si on est l'auteur de la matière, "sousErreur" si on consulte
     */
    private String retourMatiere(String action, String erreur, HttpServletRequest request) {

        request.setAttribute(action, "retourMatiere");
        String forward = livret(request);

        if (request.getParameter("ordre") != null) {
            Fonctions.enregistrerRetour("erreur", request);
        }

        try {
            Fonctions.getMatieres(request);

            //En variable de session pour enregistrerRetourMatiere()
            request.getSession().setAttribute("retour", Fonctions.getRetourMatiere(request));

            int idMatiere = (Integer) request.getAttribute("idMatiere");
            request.setAttribute("matiere", Matiere.getMatiere(idMatiere));

        } catch (AucuneMatiereException e) {
            request.setAttribute(erreur, e.toString());
        } catch (MatiereInexistanteException e) {
            request.setAttribute(erreur, e.toString());
        } catch (SQLException e) {
            request.setAttribute(erreur, "Erreur de la base de données.");
        }

        return forward;
    }

    private String retoursMatiere(HttpServletRequest request) {

        request.setAttribute("action", "retoursMatiere");
        String forward = livret(request);

        try {

            Personne identifie = (Personne) request.getSession().getAttribute("identifie");
            if (!identifie.getClass().equals(Intervenant.class)
                    && !identifie.getClass().equals(MembreAdministration.class)) {
                throw new PasLeDroitException();
            }

            Fonctions.getMatieres(request);

            int idMatiere = (Integer) request.getAttribute("idMatiere");
            Matiere matiere = Matiere.getMatiere(idMatiere);

            //Vérifier qu'il s'agit bien de la matière de l'enseignant
            if (identifie.getClass().equals(Intervenant.class)) {
                if (matiere.getEnseignant().getId() != identifie.getId()) {
                    throw new PasLeDroitException("Vous n'êtes pas l'enseignant principal de cette matière.");
                }
            }

            request.setAttribute("retours", Matiere.getRetours(idMatiere));

            request.setAttribute("matiere", matiere);

        } catch (InformationIndisponibleException e) {
            request.setAttribute("erreur", e.toString());
        } catch (PasLeDroitException e) {
            request.setAttribute("erreur", e.toString());
        } catch (AucuneMatiereException e) {
            request.setAttribute("erreur", "Pas de matières enseignées.");
        } catch (MatiereInexistanteException e) {
            request.setAttribute("erreur", e.toString());
        } catch (SQLException e) {
            request.setAttribute("erreur", "Erreur de la base de données.");
        }

        return forward;
    }

    private String profilIntervenant(HttpServletRequest request) {

        request.setAttribute("action", "profilIntervenant");
        String forward = livret(request);

        try {

            Fonctions.getIntervenants(request);

        } catch (AucunIntervenantException e) {
            request.setAttribute("erreur", e.toString());
        } catch (IntervenantInexistantException e) {
            request.setAttribute("erreur", e.toString());
        } catch (SQLException e) {
            request.setAttribute("erreur", "Erreur de la base de données.");
        }

        return forward;
    }

    private String consulter(HttpServletRequest request) {

        request.setAttribute("action", "consulter");
        String forward = livret(request);

        try {

            Personne identifie = (Personne) request.getSession().getAttribute("identifie");

            if (identifie.getClass().equals(Etudiant.class)) {
                throw new PasLeDroitException();
            }

            Fonctions.getFormations(request);
            Fonctions.getAnnees(request);

            List<Etudiant> le = Etudiant.getEtudiants(identifie.getClass(), identifie.getId());
            request.setAttribute("etudiantsTMS", le);

        } catch (PasLeDroitException e) {
            request.setAttribute("erreur", e.toString());
        } catch (SQLException e) {
            request.setAttribute("erreur", "Erreur de la base de données.");
        }
        
        return forward;

    }

    private String consulterLivret(HttpServletRequest request) {

        String forward = null;

        request.setAttribute("action", "consulterLivret");

        try {

            Personne identifie = (Personne) request.getSession().getAttribute("identifie");

            if (identifie.getClass().equals(Etudiant.class)) {
                throw new PasLeDroitException();
            }

            request.setAttribute("page", request.getParameter("page"));

            //Pour pouvoir être récupéré par le ${idEtudiant}
            request.setAttribute("idEtudiant", request.getParameter("idEtudiant"));

            if (request.getParameter("idEtudiant") == null) {
                throw new EtudiantInexistantException();
            }

            //Récupération de l'étudiant consulté
            int idEtudiant = Integer.parseInt(request.getParameter("idEtudiant"));
            Etudiant etudiantConsulte = Etudiant.getEtudiant(idEtudiant);
            request.setAttribute("etudiantConsulte", etudiantConsulte);

            //Vérifier que l'étudiant consulté appartient effectivement à ce tuteur
            if (identifie.getClass().equals(Intervenant.class)) {
                if (identifie.getId() != etudiantConsulte.getTuteur().getId()) {
                    throw new PasLeDroitException("Vous n'encadrez pas cet étudiant.");
                }
            }

            //Vérifier que l'étudiant consulté appartient effectivement à ce maitre de stage
            if (identifie.getClass().equals(MaitreDeStage.class)) {
                if (identifie.getId() != etudiantConsulte.getMaitreDeStage().getId()) {
                    throw new PasLeDroitException("Vous n'encadrez pas cet étudiant.");
                }
            }

            //Sous Menu
            request.setAttribute("lesPagesSousMenu", Fonctions.pagesAutorisees("Etudiant"));

            String page = (String) request.getAttribute("page");

            if (page == null || page.equals("profil")) {
                //Page d'accueil
                forward = profil("page", "sousErreur", request);
            } else if (page.equals("retourMatiere")) {
                forward = retourMatiere("page", "sousErreur", request);
            } else if (page.equals("retourTuteur")) {
                forward = retourTuteur("page", "sousErreur", request);
            } else if (page.equals("retourMaitre")) {
                forward = retourMaitre("page", "sousErreur", request);
            } else if (page.equals("retourAdmin")) {
                forward = retourAdmin("page", "sousErreur", request);
            } else //Page inexistante
            {
                forward = erreur("page", "sousErreur", request);
            }

            //Si on veut modifier un retour
            if (request.getParameter("ordre") != null) {
                Fonctions.enregistrerRetour("sousErreur", request);
            }

        } catch (EtudiantInexistantException e) {
            forward = livret(request);
            request.setAttribute("erreur", e.toString());
        } catch (IntervenantInexistantException e) {
            forward = livret(request);
            request.setAttribute("erreur", "La BD est incohérente : Le tuteur de l'étudiant n'existe pas.");
        } catch (MaitreDeStageInexistantException e) {
            forward = livret(request);
            request.setAttribute("erreur", "La BD est incohérente : Le maitre de stage de l'étudiant n'existe pas.");
        } catch (FormationInexistanteException e) {
            forward = livret(request);
            request.setAttribute("erreur", "La BD est incohérente : La formation de l'étudiant n'existe pas.");
        } catch (PasLeDroitException e) {
            forward = livret(request);
            request.setAttribute("erreur", e.toString());
        } catch (PasDeTuteurException e) {
            forward = livret(request);
            request.setAttribute("erreur", e.toString());
        } catch (PasDeMaitreDeStageException e) {
            forward = livret(request);
            request.setAttribute("erreur", e.toString());
        } catch (SQLException e) {
            forward = livret(request);
            request.setAttribute("erreur", "Erreur de la base de données.");
        }

        return forward;
    }

    private String consulterAdmin(HttpServletRequest request) {

        request.setAttribute("action", "consulterAdmin");
        String forward = livret(request);

        try {

            Personne identifie = (Personne) request.getSession().getAttribute("identifie");

            if (!identifie.getClass().equals(MembreAdministration.class)) {
                throw new PasLeDroitException();
            }

            Fonctions.getFormations(request);
            request.setAttribute("lesFormations", Fonctions.lesFormations(request));
            Fonctions.getAnnees(request);

            Fonctions.getEtudiants(request);

            String nomAnnee = (String) request.getAttribute("nomAnnee");
            int idFormation = (Integer) request.getAttribute("idFormation");

            request.setAttribute("tuteurs", Intervenant.getTuteurs(nomAnnee, idFormation));
            request.setAttribute("maitres", MaitreDeStage.getMaitresDeStage(nomAnnee, idFormation));

        } catch (PasLeDroitException e) {
            request.setAttribute("erreur", e.toString());
        } catch (SQLException e) {
            request.setAttribute("erreur", "Erreur de la base de données.");
        }

        return forward;
    }

    private String gestionMaitre(HttpServletRequest request) {
        request.setAttribute("action", "gestionMaitre");
        String forward = livret(request);

        try {

            Personne identifie = (Personne) request.getSession().getAttribute("identifie");

            if (!identifie.getClass().equals(MembreAdministration.class)) {
                throw new PasLeDroitException();
            }

            request.setAttribute("maitresDeStage", MaitreDeStage.getTousLesMaitresDeStage());

        } catch (PasLeDroitException e) {
            request.setAttribute("erreur", e.toString());
        } catch (SQLException e) {
            request.setAttribute("erreur", "Erreur de la base de données.");
        }

        return forward;
    }

    private String ajoutModifMaitre(HttpServletRequest request) {
        request.setAttribute("action", "ajoutModifMaitre");
        String forward = livret(request);

        try {

            //Seuls l'administration et les maitres peuvent modifier
            Personne identifie = (Personne) request.getSession().getAttribute("identifie");
            if (!identifie.getClass().equals(MembreAdministration.class)
                    && !identifie.getClass().equals(MaitreDeStage.class)) {
                throw new PasLeDroitException();
            }

            Fonctions.getMaitre(request);

            if (request.getParameter("idMaitre") != null) {
                request.setAttribute("etudiantsTMS", Etudiant.getEtudiants(MaitreDeStage.class, Integer.parseInt(request.getParameter("idMaitre"))));
            }

            Fonctions.getEtudiantsSansMaitre(request);

        } catch (PasLeDroitException e) {
            request.setAttribute("erreur", e.toString());
        } catch (MaitreDeStageInexistantException e) {
            request.setAttribute("erreur", "Le maitre de stage n'existe pas. (ou alors la BD est incohérente, ex. le maitre n'a pas d'utilisateur.)");
        } catch (SQLException e) {
            request.setAttribute("erreur", "Erreur de la base de données.");
        }

        return forward;
    }

    private String ajouterMaitre(HttpServletRequest request) {
        String forward = livret(request);

        try {

            //Seule l'administration peut ajouter des maitres de stage
            Personne identifie = (Personne) request.getSession().getAttribute("identifie");
            if (!identifie.getClass().equals(MembreAdministration.class)) {
                throw new PasLeDroitException();
            }

            String nom = request.getParameter("nom");
            String prenom = request.getParameter("prenom");
            String adresse = request.getParameter("adresse");
            String numTel = request.getParameter("numTel");
            String login = request.getParameter("login");
            String mdp = request.getParameter("mdp");
            String email = request.getParameter("email");
            String entreprise = request.getParameter("entreprise");

            MaitreDeStage ms = MaitreDeStage.enregistrerNouveauMaitreDeStage(nom, prenom, adresse, numTel, login, mdp, email, entreprise);
            Fonctions.affecterEtudiants(request, ms);

            forward = gestionMaitre(request);

        } catch (PasLeDroitException e) {
            request.setAttribute("erreur", e.toString());

        } catch (SQLException e) {
            request.setAttribute("erreur", "Erreur de la base de données. (ex : le login existe déjà.)");
        }

        return forward;
    }

    private String modifierMaitre(HttpServletRequest request) {
        request.setAttribute("action", "ajoutModifMaitre");
        String forward = livret(request);

        //Il faudrait vérifier, est-ce que le maitre modifié est bien le maitre identifié

        int idMaitre = Integer.parseInt(request.getParameter("idms"));
        String nom = request.getParameter("nom");
        String prenom = request.getParameter("prenom");
        String email = request.getParameter("email");
        String adresse = request.getParameter("adresse");
        String numTel = request.getParameter("numTel");
        String entreprise = request.getParameter("entreprise");
        String login = request.getParameter("login");
        String mdp = request.getParameter("mdp");

        try {
            //L'administration modifie le maitre
            if (request.getSession().getAttribute("typePersonne").equals("MembreAdministration")) {
                MaitreDeStage ms = MaitreDeStage.getMaitreDeStage(idMaitre);
                ms.MAJMaitre(nom, prenom, adresse, email, numTel, login, mdp, entreprise);
                Fonctions.affecterEtudiants(request, ms);
                forward = gestionMaitre(request);

            } else //La maitre de stage modifie son propre profil
            {
                MaitreDeStage ms = (MaitreDeStage) request.getSession().getAttribute("identifie");
                ms.MAJMaitre(nom, prenom, adresse, email, numTel, login, mdp, entreprise);
                forward = profil("action", "erreur", request);
            }
        } catch (MaitreDeStageInexistantException e) {
            request.setAttribute("erreur", e.toString());

        } catch (SQLException e) {
            request.setAttribute("erreur", "Erreur de la base de données. (ex : le login existe déjà.)");
        }

        return forward;
    }

    private String supprimerMaitre(HttpServletRequest request) throws IOException, ServletException {
        request.setAttribute("action", "gestionMaitre");
        String forward = livret(request);

        try {

            Personne identifie = (Personne) request.getSession().getAttribute("identifie");

            if (!identifie.getClass().equals(MembreAdministration.class)) {
                throw new PasLeDroitException();
            }


            if (request.getParameter("idMaitre") != null) {
                int idMaitre = Integer.parseInt(request.getParameter("idMaitre"));
                MaitreDeStage.supprimerMaitre(idMaitre);

            }

            forward = gestionMaitre(request);

        } catch (PasLeDroitException e) {
            request.setAttribute("erreur", e.toString());
        } catch (MaitreDeStageInexistantException e) {
            request.setAttribute("erreur", "Le maitre de stage n'existe pas. (ou alors la BD est incohérente, ex. le maitre n'a pas d'utilisateur.)");
        } catch (SQLException e) {
            request.setAttribute("erreur", "Erreur de la base de données.");
        }

        return forward;
    }

    /**
     * Afficher une page d'erreur ou de sous-erreur (si on consulte un livret d'étudiant)
     * @param action "action" si l'erreur se situe au niveau de 'action', "page" si au niveau de 'page'
     * @param erreur "erreur" si l'erreur se situe au niveau de 'action', "sousErreur"  si au niveau de 'page'
     */
    private String erreur(String action, String erreur, HttpServletRequest request) {
        request.setAttribute(action, "erreur");
        String forward = livret(request);

        request.setAttribute(erreur, "Page inexistante.");
        return forward;
    }
}
